iT邦幫忙

2023 iThome 鐵人賽

DAY 2
0
自我挑戰組

Makefile的入門講解系列 第 9

Makefile的入門講解 - day 9 簡單的測試3 - 變量1 模式匹配

  • 分享至 

  • xImage
  •  

模式匹配大致用了 4 個:

  1. $@ : 所有的目標
  2. $^ : 所有目標的依賴
  3. $< : 第一個目標
  4. %.c : 符合 "XXX.c" 的文件
  5. %.o : 符合 "XXX.o" 的文件

一個簡單的範例


test:test.o test1.o test2.o
        gcc -o test test.o test1.o test2.o
        @echo "@: $@  "
        @echo "^: $^  "
        @echo "<: $<  "

test.o:test.c
        gcc -o test.o -c test.c
test1.o:test1.c
        gcc -o test1.o -c test1.c
test2.o:test2.c
        gcc -o test2.o -c test2.c

clean:
        rm -f test test.o  test1.o test2.o

執行

make

輸出

gcc -o test.o -c test.c
gcc -o test1.o -c test1.c
gcc -o test2.o -c test2.c
gcc -o test test.o test1.o test2.o
@: test
^: test.o test1.o test2.o
<: test.o

我們來試著用 $@ $^ 來簡化

$@(所有的目標)、 $^(所有目標的依賴),所以我們可以將 gcc的部分簡化

gcc -o test.o -c test.cgcc -o $@ -c $^
gcc -o test test.o test1.o test2.ogcc -o $@ $^

test:test.o test1.o test2.o
        gcc -o $@ $^
        @echo "@: $@  "
        @echo "^: $^  "
        @echo "<: $<  "

test.o:test.c
        gcc -o $@ -c $^
test1.o:test1.c
        gcc -o $@ -c $^
test2.o:test2.c
        gcc -o $@ -c $^

clean:
        rm -f test test.o  test1.o test2.o

執行

make

輸出

gcc -o test.o -c test.c
gcc -o test1.o -c test1.c
gcc -o test2.o -c test2.c
gcc -o test test.o test1.o test2.o
@: test
^: test.o test1.o test2.o
<: test.o

我們來試著用 %.c %.o 來簡化

由於當前目錄下
1. "XXX.c" 就是 test.c test1.c test2.c
2. "XXX.o" 就是 test.o test1.o test2.o
3. 所以可以直接簡化為 %.o 與 %.c


test:test.o test1.o test2.o
        gcc -o $@ $^
        @echo "@: $@  "
        @echo "^: $^  "
        @echo "<: $<  "
%.o:%.c
        gcc -o $@ -c $^
clean:
        rm -f test test.o  test1.o test2.o

執行

make

輸出

gcc -o test.o -c test.c
gcc -o test1.o -c test1.c
gcc -o test2.o -c test2.c
gcc -o test test.o test1.o test2.o
@: test
^: test.o test1.o test2.o
<: test.o

上一篇
Makefile的入門講解 - day 8 簡單的測試2 - 規則說明1
下一篇
Makefile的入門講解 - day 10 簡單的測試4 - 變量2 變數賦值
系列文
Makefile的入門講解11
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言